Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Convolutional code</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Convolutional_code"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/mediawiki.page.gallery.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Convolutional_code rootpage-Convolutional_code skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Convolutional code</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style>
<p>In <a href="Telecommunications" title="Telecommunications">telecommunication</a>, a <b>convolutional code</b> is a type of <a href="Error_correction_code" title="Error correction code">error-correcting code</a> that generates parity symbols via the sliding application of a <a href="Algebraic_normal_form" title="Algebraic normal form">boolean polynomial</a> function to a data stream. The sliding application represents the 'convolution' of the encoder over the data, which gives rise to the term 'convolutional coding'. The sliding nature of the convolutional codes facilitates <a href="Trellis_(graph)" title="Trellis (graph)">trellis</a> decoding using a time-invariant trellis. Time invariant trellis decoding allows convolutional codes to be maximum-likelihood soft-decision decoded with reasonable complexity.
</p><p>The ability to perform economical maximum likelihood soft decision decoding is one of the major benefits of convolutional codes. This is in contrast to classic block codes, which are generally represented by a time-variant trellis and therefore are typically hard-decision decoded. Convolutional codes are often characterized by the base <a href="Code_rate" title="Code rate">code rate</a> and the depth (or memory) of the encoder <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle [n,k,K]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>,</mo>
<mi>k</mi>
<mo>,</mo>
<mi>K</mi>
<mo stretchy="false">]</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle [n,k,K]}</annotation>
</semantics>
</math></span><img src="./3b79e3732d617bcbd9cb5c8ab76e90da7de8b66c.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:8.033ex; height:2.843ex;" alt="{\displaystyle [n,k,K]}" loading="lazy"></span>. The base code rate is typically given as <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n/k}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mi>k</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n/k}</annotation>
</semantics>
</math></span><img src="./761557c05efc5c1109da15c578dc9df4a7a32790.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:3.768ex; height:2.843ex;" alt="{\displaystyle n/k}" loading="lazy"></span>, where <span class="texhtml mvar" style="font-style:italic;">n</span> is the raw input data rate and <span class="texhtml mvar" style="font-style:italic;">k</span> is the data rate of output channel encoded stream. <span class="texhtml mvar" style="font-style:italic;">n</span> is less than <span class="texhtml mvar" style="font-style:italic;">k</span> because channel coding inserts redundancy in the input bits. The memory is often called the "constraint length" <span class="texhtml mvar" style="font-style:italic;">K</span>, where the output is a function of the current input as well as the previous <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle K-1}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>K</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle K-1}</annotation>
</semantics>
</math></span><img src="./dd6e429474c269979f75b41db5d334243b3dccd3.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:6.069ex; height:2.343ex;" alt="{\displaystyle K-1}" loading="lazy"></span> inputs. The depth may also be given as the number of memory elements <span class="texhtml mvar" style="font-style:italic;">v</span> in the polynomial or the maximum possible number of states of the encoder (typically: <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 2^{v}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msup>
<mn>2</mn>
<mrow class="MJX-TeXAtom-ORD">
<mi>v</mi>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 2^{v}}</annotation>
</semantics>
</math></span><img src="./e05d3d138f6407ef0089ec0d94eed46f69021a6d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.192ex; height:2.343ex;" alt="{\displaystyle 2^{v}}" loading="lazy"></span>).
</p><p>Convolutional codes are often described as continuous. However, it may also be said that convolutional codes have arbitrary block length, rather than being continuous, since most real-world convolutional encoding is performed on blocks of data. Convolutionally encoded block codes typically employ termination. The arbitrary block length of convolutional codes can also be contrasted to classic <a href="Block_code" title="Block code">block codes</a>, which generally have fixed block lengths that are determined by algebraic properties.
</p><p>The code rate of a convolutional code is commonly modified via <a href="Punctured_code" title="Punctured code">symbol puncturing</a>. For example, a convolutional code with a 'mother' code rate <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n/k=1/2}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mi>k</mi>
<mo>=</mo>
<mn>1</mn>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mn>2</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n/k=1/2}</annotation>
</semantics>
</math></span><img src="./6d7396f337b1afbd1e4c536d690963afc0a66772.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.354ex; height:2.843ex;" alt="{\displaystyle n/k=1/2}" loading="lazy"></span> may be punctured to a higher rate of, for example, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 7/8}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>7</mn>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mn>8</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 7/8}</annotation>
</semantics>
</math></span><img src="./76007e6d06c1923c04f8d247c712586967d76fa9.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:3.487ex; height:2.843ex;" alt="{\displaystyle 7/8}" loading="lazy"></span> simply by not transmitting a portion of code symbols. The performance of a punctured convolutional code generally scales well with the amount of parity transmitted. The ability to perform economical soft decision decoding on convolutional codes, as well as the block length and code rate flexibility of convolutional codes, makes them very popular for digital communications.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p>Convolutional codes were introduced in 1955 by <a href="Peter_Elias" title="Peter Elias">Peter Elias</a>. It was thought that convolutional codes could be decoded with arbitrary quality at the expense of computation and delay. In 1967, <a href="Andrew_Viterbi" title="Andrew Viterbi">Andrew Viterbi</a> determined that convolutional codes could be maximum-likelihood decoded with reasonable complexity using time invariant trellis based decoders — the <a href="Viterbi_algorithm" title="Viterbi algorithm">Viterbi algorithm</a>. Other trellis-based decoder algorithms were later developed, including the <a href="BCJR_algorithm" title="BCJR algorithm">BCJR</a> decoding algorithm.
</p><p>Recursive systematic convolutional codes were invented by <a href="Claude_Berrou" title="Claude Berrou">Claude Berrou</a> around 1991. These codes proved especially useful for iterative processing including the processing of concatenated codes such as <a href="Turbo_code" title="Turbo code">turbo codes</a>.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p><p>Using the "convolutional" terminology, a classic convolutional code might be considered a <a href="Finite_impulse_response" title="Finite impulse response">Finite impulse response</a> (FIR) filter, while a recursive convolutional code might be considered an <a href="Infinite_impulse_response" title="Infinite impulse response">Infinite impulse response</a> (IIR) filter.
</p>
<div class="mw-heading mw-heading2"><h2 id="Where_convolutional_codes_are_used">Where convolutional codes are used</h2></div>

<p>Convolutional codes are used extensively to achieve reliable data transfer in numerous applications, such as <a href="Digital_video" title="Digital video">digital video</a>, radio, <a href="Mobile_telephony" title="Mobile telephony">mobile communications</a> (e.g., in GSM, GPRS, EDGE and 3G networks (until 3GPP Release 7)<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>) and <a href="Communications_satellite" title="Communications satellite">satellite communications</a>.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> These codes are often implemented in <a href="Concatenated_error_correction_code" title="Concatenated error correction code">concatenation</a> with a hard-decision code, particularly <a href="Reed%E2%80%93Solomon_error_correction" title="Reed–Solomon error correction">Reed–Solomon</a>. Prior to <a href="Turbo_code" title="Turbo code">turbo codes</a> such constructions were the most efficient, coming closest to the <a href="Shannon%E2%80%93Hartley_theorem" title="Shannon–Hartley theorem">Shannon limit</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Convolutional_encoding">Convolutional encoding</h2></div>
<p>To convolutionally encode data, start with <i>k</i> <a href="Processor_register" title="Processor register">memory registers</a>, each holding one input bit. Unless otherwise specified, all memory registers start with a value of 0. The encoder has <i>n</i> modulo-2 <a href="Adder_(electronics)" title="Adder (electronics)">adders</a> (a modulo 2 adder can be implemented with a single <a href="Boolean_algebra" title="Boolean algebra">Boolean</a> <a href="XOR_gate" title="XOR gate">XOR gate</a>, where the logic is: <span class="texhtml">0+0&nbsp;=&nbsp;0</span>, <span class="texhtml">0+1&nbsp;=&nbsp;1</span>, <span class="texhtml">1+0&nbsp;=&nbsp;1</span>, <span class="texhtml">1+1&nbsp;=&nbsp;0</span>), and <i>n</i> <a href="Polynomial_code" title="Polynomial code">generator polynomials</a> — one for each adder (see figure below). An input bit <i>m</i><sub>1</sub> is fed into the leftmost register. Using the generator polynomials and the existing values in the remaining registers, the encoder outputs <i>n</i> symbols. These symbols may be transmitted or punctured depending on the desired code rate. Now <a href="Bitwise_operation#Bit_shifts" title="Bitwise operation">bit shift</a> all register values to the right (<i>m</i><sub>1</sub> moves to <i>m</i><sub>0</sub>, <i>m</i><sub>0</sub> moves to <i>m</i><sub>−1</sub>) and wait for the next input bit. If there are no remaining input bits, the encoder continues shifting until all registers have returned to the zero state (flush bit termination).
</p>

<p>The figure below is a rate <style data-mw-deduplicate="TemplateStyles:r1154941027">
/* start https://en.wikipedia.org/ */


.mw-parser-output .frac{white-space:nowrap}.mw-parser-output .frac .num,.mw-parser-output .frac .den{font-size:80%;line-height:0;vertical-align:super}.mw-parser-output .frac .den{vertical-align:sub}.mw-parser-output .sr-only{border:0;clip:rect(0,0,0,0);clip-path:polygon(0px 0px,0px 0px,0px 0px);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}


/* end https://en.wikipedia.org/ */
</style><span class="frac"><span class="num">1</span>⁄<span class="den">3</span></span> (<span class="frac"><span class="num"><i>m</i></span>⁄<span class="den"><i>n</i></span></span>) encoder with constraint length (<i>k</i>) of 3. Generator polynomials are <span class="texhtml"><i>G</i><sub>1</sub> = (1,1,1),</span> <span class="texhtml"><i>G</i><sub>2</sub> = (0,1,1)</span>, and <span class="texhtml"><i>G</i><sub>3</sub> = (1,0,1)</span>. Therefore, output bits are calculated (modulo 2) as follows:
</p>
<dl><dd><i>n</i><sub>1</sub> = <i>m</i><sub>1</sub> + <i>m</i><sub>0</sub> + <i>m</i><sub>−1</sub></dd>
<dd><i>n</i><sub>2</sub> = <i>m</i><sub>0</sub> + <i>m</i><sub>−1</sub></dd>
<dd><i>n</i><sub>3</sub> = <i>m</i><sub>1</sub> + <i>m</i><sub>−1</sub>.</dd></dl>
<p>Convolutional codes can be systematic and non-systematic:
</p>
<ul><li>systematic repeats the structure of the message before encoding</li>
<li>non-systematic changes the initial structure</li></ul>
<p>Non-systematic convolutional codes are more popular due to better noise immunity. It relates to the free distance of the convolutional code.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p>
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px">
<div class="thumb" style="width: 150px; height: 180px;"><span typeof="mw:File"></span></div>
<div class="gallerytext">A short illustration of non-systematic convolutional code.</div>
</li>
<li class="gallerybox" style="width: 155px">
<div class="thumb" style="width: 150px; height: 180px;"><span typeof="mw:File"></span></div>
<div class="gallerytext">A short illustration of systematic convolutional code.</div>
</li>
</ul>
<div class="mw-heading mw-heading2"><h2 id="Recursive_and_non-recursive_codes">Recursive and non-recursive codes</h2></div>
<p>The encoder on the picture above is a <i>non-recursive</i> encoder. Here's an example of a recursive one and as such it admits a feedback structure:
</p>

<p>The example encoder is <i><a href="Systematic_code" title="Systematic code">systematic</a></i> because the input data is also used in the output symbols (Output 2). Codes with output symbols that do not include the input data are called <i>non-systematic.</i>
</p><p>Recursive codes are typically systematic and, conversely, non-recursive codes are typically non-systematic. It isn't a strict requirement, but a common practice.
</p><p>The example encoder in Img. 2. is an 8-state encoder because the 3 registers will create 8 possible encoder states (2<sup>3</sup>). A corresponding decoder trellis will typically use 8 states as well.
</p><p>Recursive systematic convolutional (RSC) codes have become more popular due to their use in Turbo Codes. Recursive systematic codes are also referred to as pseudo-systematic codes.
</p><p>Other RSC codes and example applications include:
</p>

<p>Useful for <a href="Low-density_parity-check_code" title="Low-density parity-check code">LDPC</a> code implementation and as inner constituent code for <a href="Serial_concatenated_convolutional_codes" title="Serial concatenated convolutional codes">serial concatenated convolutional codes</a> (SCCC's).
</p>

<p>Useful for SCCC's and multidimensional turbo codes.
</p>

<p>Useful as constituent code in low error rate turbo codes for applications such as satellite links. Also suitable as SCCC outer code.
</p>
<div class="mw-heading mw-heading2"><h2 id="Impulse_response,_transfer_function,_and_constraint_length">Impulse response, transfer function, and constraint length</h2></div>
<p>A convolutional encoder is called so because it performs a <i><a href="Convolution" title="Convolution">convolution</a></i> of the input stream with the encoder's <i>impulse responses</i>:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y_{i}^{j}=\sum _{k=0}^{\infty }h_{k}^{j}x_{i-k}=(x*h^{j})[i],}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msubsup>
<mi>y</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>j</mi>
</mrow>
</msubsup>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>=</mo>
<mn>0</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</munderover>
<msubsup>
<mi>h</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>j</mi>
</mrow>
</msubsup>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
</mrow>
</msub>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>∗<!-- ∗ --></mo>
<msup>
<mi>h</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>j</mi>
</mrow>
</msup>
<mo stretchy="false">)</mo>
<mo stretchy="false">[</mo>
<mi>i</mi>
<mo stretchy="false">]</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y_{i}^{j}=\sum _{k=0}^{\infty }h_{k}^{j}x_{i-k}=(x*h^{j})[i],}</annotation>
</semantics>
</math></span><img src="./37626083236994588ffa49f06b4b3f8e05facffb.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.171ex; width:29.027ex; height:7.009ex;" alt="{\displaystyle y_{i}^{j}=\sum _{k=0}^{\infty }h_{k}^{j}x_{i-k}=(x*h^{j})[i],}" loading="lazy"></span></dd></dl>
<p>where <span class="texhtml mvar" style="font-style:italic;">x</span> is an input sequence, <span class="texhtml mvar" style="font-style:italic;">y<sup>j</sup></span> is a sequence from output <span class="texhtml mvar" style="font-style:italic;">j</span>, <span class="texhtml mvar" style="font-style:italic;">h<sup>j</sup></span> is an impulse response for output <span class="texhtml mvar" style="font-style:italic;">j</span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {*}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mo>∗<!-- ∗ --></mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {*}}</annotation>
</semantics>
</math></span><img src="./e064ec643817d84cbd406d7af21607f0e4a5bb05.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: 0.079ex; margin-bottom: -0.25ex; width:1.162ex; height:1.509ex;" alt="{\displaystyle {*}}" loading="lazy"></span> denotes convolution.
</p><p>A convolutional encoder is a discrete <a href="LTI_system" class="mw-redirect" title="LTI system">linear time-invariant system</a>. Every output of an encoder can be described by its own <a href="Transfer_function" title="Transfer function">transfer function</a>, which is closely related to the generator polynomial. An impulse response is connected with a transfer function through <a href="Z-transform" title="Z-transform">Z-transform</a>.
</p><p>Transfer functions for the first (non-recursive) encoder are:
</p>
<ul><li><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{1}(z)=1+z^{-1}+z^{-2},\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mo>+</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msup>
<mo>+</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>2</mn>
</mrow>
</msup>
<mo>,</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H_{1}(z)=1+z^{-1}+z^{-2},\,}</annotation>
</semantics>
</math></span><img src="./7d22be8cf2c84fd0b03d9ffeb2209db03dd3ffb7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:23.705ex; height:3.176ex;" alt="{\displaystyle H_{1}(z)=1+z^{-1}+z^{-2},\,}" loading="lazy"></span></li>
<li><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{2}(z)=z^{-1}+z^{-2},\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msup>
<mo>+</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>2</mn>
</mrow>
</msup>
<mo>,</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H_{2}(z)=z^{-1}+z^{-2},\,}</annotation>
</semantics>
</math></span><img src="./e74d59a4874672d3b97b7d0749424a8b77a0e773.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:19.702ex; height:3.176ex;" alt="{\displaystyle H_{2}(z)=z^{-1}+z^{-2},\,}" loading="lazy"></span></li>
<li><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{3}(z)=1+z^{-2}.\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>3</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mo>+</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>2</mn>
</mrow>
</msup>
<mo>.</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H_{3}(z)=1+z^{-2}.\,}</annotation>
</semantics>
</math></span><img src="./fa9e4aa138229b2da9c77a15b16e00de82f89dbb.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:17.441ex; height:3.176ex;" alt="{\displaystyle H_{3}(z)=1+z^{-2}.\,}" loading="lazy"></span></li></ul>
<p>Transfer functions for the second (recursive) encoder are:
</p>
<ul><li><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{1}(z)={\frac {1+z^{-1}+z^{-3}}{1-z^{-2}-z^{-3}}},\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mn>1</mn>
<mo>+</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msup>
<mo>+</mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>3</mn>
</mrow>
</msup>
</mrow>
<mrow>
<mn>1</mn>
<mo>−<!-- − --></mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>2</mn>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<msup>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mn>3</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
<mo>,</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H_{1}(z)={\frac {1+z^{-1}+z^{-3}}{1-z^{-2}-z^{-3}}},\,}</annotation>
</semantics>
</math></span><img src="./d57d9371f3a737ac81f53a01828992778eebec1a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.338ex; width:24.541ex; height:6.176ex;" alt="{\displaystyle H_{1}(z)={\frac {1+z^{-1}+z^{-3}}{1-z^{-2}-z^{-3}}},\,}" loading="lazy"></span></li>
<li><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{2}(z)=1.\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1.</mn>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H_{2}(z)=1.\,}</annotation>
</semantics>
</math></span><img src="./937a24ceacf0ac2980c2d67abd9f7cda841c2810.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:11.178ex; height:2.843ex;" alt="{\displaystyle H_{2}(z)=1.\,}" loading="lazy"></span></li></ul>
<p>Define <span class="texhtml mvar" style="font-style:italic;">m</span> by
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle m=\max _{i}\operatorname {polydeg} (H_{i}(1/z))\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>m</mi>
<mo>=</mo>
<munder>
<mo movablelimits="true" form="prefix">max</mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</munder>
<mi>polydeg</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle m=\max _{i}\operatorname {polydeg} (H_{i}(1/z))\,}</annotation>
</semantics>
</math></span><img src="./2e2ed6adf8ac69663079195204b0bde6b4590918.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.005ex; width:27.818ex; height:4.009ex;" alt="{\displaystyle m=\max _{i}\operatorname {polydeg} (H_{i}(1/z))\,}" loading="lazy"></span></dd></dl>
<p>where, for any <a href="Rational_function" title="Rational function">rational function</a> <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(z)=P(z)/Q(z)\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>P</mi>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mi>Q</mi>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(z)=P(z)/Q(z)\,}</annotation>
</semantics>
</math></span><img src="./1780c6b5a1c42cb8626656869f301aa7e64f0e2a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:18.203ex; height:2.843ex;" alt="{\displaystyle f(z)=P(z)/Q(z)\,}" loading="lazy"></span>,
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \operatorname {polydeg} (f)=\max(\deg(P),\deg(Q))\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>polydeg</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mo movablelimits="true" form="prefix">max</mo>
<mo stretchy="false">(</mo>
<mi>deg</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>P</mi>
<mo stretchy="false">)</mo>
<mo>,</mo>
<mi>deg</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>Q</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \operatorname {polydeg} (f)=\max(\deg(P),\deg(Q))\,}</annotation>
</semantics>
</math></span><img src="./d8b8bfe8481a26454edd6046a8f6ef4e4d276a96.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:35.736ex; height:2.843ex;" alt="{\displaystyle \operatorname {polydeg} (f)=\max(\deg(P),\deg(Q))\,}" loading="lazy"></span>.</dd></dl>
<p>Then <span class="texhtml mvar" style="font-style:italic;">m</span> is the maximum of the <a href="Degree_of_a_polynomial" title="Degree of a polynomial">polynomial degrees</a> of the
</p><p><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{i}(1/z)\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mrow class="MJX-TeXAtom-ORD">
<mo>/</mo>
</mrow>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H_{i}(1/z)\,}</annotation>
</semantics>
</math></span><img src="./f0810d955f2f4a3566ab60c98b95eef39670535b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:8.34ex; height:2.843ex;" alt="{\displaystyle H_{i}(1/z)\,}" loading="lazy"></span>, and the <i>constraint length</i> is defined as <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle K=m+1\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>K</mi>
<mo>=</mo>
<mi>m</mi>
<mo>+</mo>
<mn>1</mn>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle K=m+1\,}</annotation>
</semantics>
</math></span><img src="./b2fcd91e429864581080b2e3b0993c09064f4920.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:11.595ex; height:2.343ex;" alt="{\displaystyle K=m+1\,}" loading="lazy"></span>. For instance, in the first example the constraint length is 3, and in the second the constraint length is 4.
</p>
<div class="mw-heading mw-heading2"><h2 id="Trellis_diagram">Trellis diagram</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">See also: <a href="Trellis_(graph)" title="Trellis (graph)">Trellis (graph)</a> and <a href="Trellis_coded_modulation" title="Trellis coded modulation">Trellis coded modulation</a></div>
<p>A convolutional encoder is a <a href="Finite-state_machine" title="Finite-state machine">finite state machine</a>. An encoder with <i>n</i> binary cells will have 2<sup><i>n</i></sup> states.
</p><p>Imagine that the encoder (shown on Img.1, above) has '1' in the left memory cell (<i>m</i><sub>0</sub>), and '0' in the right one (<i>m</i><sub>−1</sub>). (<i>m</i><sub>1</sub> is not really a memory cell because it represents a current value). We will designate such a state as "10". According to an input bit the encoder at the next turn can convert either to the "01" state or the "11" state. One can see that not all transitions are possible for (e.g., a decoder can't convert from "10" state to "00" or even stay in "10" state).
</p><p>All possible transitions can be shown as below:
</p>

<p>An actual encoded sequence can be represented as a path on this graph. One valid path is shown in red as an example.
</p><p>This diagram gives us an idea about <i>decoding</i>: if a received sequence doesn't fit this graph, then it was received with errors, and we must choose the nearest <i>correct</i> (fitting the graph) sequence. The real decoding algorithms exploit this idea.
</p>
<div class="mw-heading mw-heading2"><h2 id="Free_distance_and_error_distribution">Free distance and error distribution</h2></div>

<p>The <b>free distance</b><sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> (<i>d</i>) is the minimal <a href="Hamming_distance" title="Hamming distance">Hamming distance</a> between different encoded sequences. The <i>correcting capability</i> (<i>t</i>) of a convolutional code is the number of errors that can be corrected by the code. It can be calculated as
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle t=\left\lfloor {\frac {d-1}{2}}\right\rfloor .}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>t</mi>
<mo>=</mo>
<mrow>
<mo>⌊</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mn>2</mn>
</mfrac>
</mrow>
<mo>⌋</mo>
</mrow>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle t=\left\lfloor {\frac {d-1}{2}}\right\rfloor .}</annotation>
</semantics>
</math></span><img src="./94343374ce0ab871921a75e5bafbc6376d2c3335.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:13.737ex; height:6.176ex;" alt="{\displaystyle t=\left\lfloor {\frac {d-1}{2}}\right\rfloor .}" loading="lazy"></span></dd></dl>
<p>Since a convolutional code doesn't use blocks, processing instead a continuous bitstream, the value of <i>t</i> applies to a quantity of errors located relatively near to each other. That is, multiple groups of <i>t</i> errors can usually be fixed when they are relatively far apart.
</p><p>Free distance can be interpreted as the minimal length of an erroneous "burst" at the output of a convolutional decoder. The fact that errors appear as "bursts" should be accounted for when designing a <a href="Concatenated_error_correction_code" title="Concatenated error correction code">concatenated code</a> with an inner convolutional code. The popular solution for this problem is to <a href="Error_correction_code#Interleaving" title="Error correction code">interleave</a> data before convolutional encoding, so that the outer block (usually <a href="Reed%E2%80%93Solomon_error_correction" title="Reed–Solomon error correction">Reed–Solomon</a>) code can correct most of the errors.
</p>
<div class="mw-heading mw-heading2"><h2 id="Decoding_convolutional_codes">Decoding convolutional codes</h2></div>
<div role="note" class="hatnote navigation-not-searchable">See also: <a href="Viterbi_algorithm" title="Viterbi algorithm">Viterbi algorithm</a></div>

<p>Several <a href="Algorithm" title="Algorithm">algorithms</a> exist for decoding convolutional codes. For relatively small values of <i>k</i>, the <a href="Viterbi_algorithm" title="Viterbi algorithm">Viterbi algorithm</a> is universally used as it provides <a href="Maximum_likelihood_estimation" title="Maximum likelihood estimation">maximum likelihood</a> performance and is highly parallelizable. Viterbi decoders are thus easy to implement in <a href="Very-large-scale_integration" title="Very-large-scale integration">VLSI</a> hardware and in software on CPUs with <a href="Single_instruction%2C_multiple_data" title="Single instruction, multiple data">SIMD</a> instruction sets.
</p><p>Longer constraint length codes are more practically decoded with any of several <a href="Sequential_decoding" title="Sequential decoding">sequential decoding</a> algorithms, of which the <a href="Robert_Fano" title="Robert Fano">Fano</a> algorithm is the best known. Unlike Viterbi decoding, sequential decoding is not maximum likelihood but its complexity increases only slightly with constraint length, allowing the use of strong, long-constraint-length codes. Such codes were used in the <a href="Pioneer_program" title="Pioneer program">Pioneer program</a> of the early 1970s to Jupiter and Saturn, but gave way to shorter, Viterbi-decoded codes, usually concatenated with large <a href="Reed%E2%80%93Solomon_error_correction" title="Reed–Solomon error correction">Reed–Solomon error correction</a> codes that steepen the overall bit-error-rate curve and produce extremely low residual undetected error rates.
</p><p>Both Viterbi and sequential decoding algorithms return hard decisions: the bits that form the most likely codeword. An approximate confidence measure can be added to each bit by use of the <a href="Viterbi_algorithm#Soft_output_Viterbi_algorithm" title="Viterbi algorithm">Soft output Viterbi algorithm</a>. <a href="Maximum_a_posteriori_estimation" title="Maximum a posteriori estimation">Maximum a posteriori</a> (MAP) soft decisions for each bit can be obtained by use of the <a href="BCJR_algorithm" title="BCJR algorithm">BCJR algorithm</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Popular_convolutional_codes">Popular convolutional codes</h2></div>


<p>In fact, predefined convolutional codes structures obtained during scientific researches are used in the industry. This relates to the possibility to select catastrophic convolutional codes (causes larger number of errors).
</p><p>An especially popular Viterbi-decoded convolutional code, used at least since the <a href="Voyager_program" title="Voyager program">Voyager program</a>, has a constraint length <span class="texhtml mvar" style="font-style:italic;">K</span> of 7 and a rate <i>r</i> of 1/2.<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p><p><a href="Mars_Pathfinder" title="Mars Pathfinder">Mars Pathfinder</a>, <a href="Mars_Exploration_Rover" title="Mars Exploration Rover">Mars Exploration Rover</a> and the <a href="Cassini%E2%80%93Huygens" title="Cassini–Huygens">Cassini probe</a> to Saturn use a <span class="texhtml mvar" style="font-style:italic;">K</span> of 15 and a rate of 1/6; this code performs about 2&nbsp;dB better than the simpler <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle K=7}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>K</mi>
<mo>=</mo>
<mn>7</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle K=7}</annotation>
</semantics>
</math></span><img src="./37b54bf2bb18c22b79780d8d557a7521706d2088.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:6.327ex; height:2.176ex;" alt="{\displaystyle K=7}" loading="lazy"></span> code at a cost of 256× in decoding complexity (compared to Voyager mission codes).
</p><p>The convolutional code with a constraint length of 2 and a rate of 1/2 is used in <a href="GSM" title="GSM">GSM</a> as an error correction technique.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Punctured_convolutional_codes">Punctured convolutional codes</h2></div>
<div role="note" class="hatnote navigation-not-searchable">See also: <a href="Punctured_code" title="Punctured code">Punctured code</a></div>

<p>Convolutional code with any code rate can be designed based on polynomial selection;<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> however, in practice, a puncturing procedure is often used to achieve the required code rate. <a href="Punctured_code" title="Punctured code">Puncturing</a> is a technique used to make a <i>m</i>/<i>n</i> rate code from a "basic" low-rate (e.g., 1/<i>n</i>) code. It is achieved by deleting of some bits in the encoder output. Bits are deleted according to a <i>puncturing matrix</i>. The following puncturing matrices are the most frequently used:
</p>
<table class="wikitable">
<tbody><tr>
<th>Code rate
</th>
<th>Puncturing matrix
</th>
<th width="128px">Free distance (for NASA standard K=7 convolutional code)
</th></tr>
<tr>
<td>1/2<br>(No perf.)
</td>
<td>
<table border="0">

<tbody><tr>
<td>1
</td></tr>
<tr>
<td>1
</td></tr></tbody></table>
</td>
<td>10
</td></tr>
<tr>
<td>2/3
</td>
<td>
<table border="0">

<tbody><tr>
<td>1
</td>
<td>0
</td></tr>
<tr>
<td>1
</td>
<td>1
</td></tr></tbody></table>
</td>
<td>6
</td></tr>
<tr>
<td>3/4
</td>
<td>
<table border="0">

<tbody><tr>
<td>1
</td>
<td>0
</td>
<td>1
</td></tr>
<tr>
<td>1
</td>
<td>1
</td>
<td>0
</td></tr></tbody></table>
</td>
<td>5
</td></tr>
<tr>
<td>5/6
</td>
<td>
<table border="0">

<tbody><tr>
<td>1
</td>
<td>0
</td>
<td>1
</td>
<td>0
</td>
<td>1
</td></tr>
<tr>
<td>1
</td>
<td>1
</td>
<td>0
</td>
<td>1
</td>
<td>0
</td></tr></tbody></table>
</td>
<td>4
</td></tr>
<tr>
<td>7/8
</td>
<td>
<table border="0">

<tbody><tr>
<td>1
</td>
<td>0
</td>
<td>0
</td>
<td>0
</td>
<td>1
</td>
<td>0
</td>
<td>1
</td></tr>
<tr>
<td>1
</td>
<td>1
</td>
<td>1
</td>
<td>1
</td>
<td>0
</td>
<td>1
</td>
<td>0
</td></tr></tbody></table>
</td>
<td>3
</td></tr></tbody></table>
<p>For example, if we want to make a code with rate 2/3 using the appropriate matrix from the above table, we should take a basic encoder output and transmit every first bit from the first branch and every bit from the second one. The specific order of transmission is defined by the respective communication standard.
</p><p>Punctured convolutional codes are widely used in the <a href="Communications_satellite" title="Communications satellite">satellite communications</a>, for example, in <a href="Intelsat" title="Intelsat">Intelsat</a> systems and <a href="DVB" title="DVB">Digital Video Broadcasting</a>.
</p><p>Punctured convolutional codes are also called "perforated".
</p>
<div class="mw-heading mw-heading2"><h2 id="Turbo_codes:_replacing_convolutional_codes">Turbo codes: replacing convolutional codes</h2></div>
<div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Turbo_code" title="Turbo code">Turbo code</a></div>

<p>Simple Viterbi-decoded convolutional codes are now giving way to <a href="Turbo_code" title="Turbo code">turbo codes</a>, a new class of iterated short convolutional codes that closely approach the theoretical limits imposed by <a href="Noisy-channel_coding_theorem" title="Noisy-channel coding theorem">Shannon's theorem</a> with much less decoding complexity than the Viterbi algorithm on the long convolutional codes that would be required for the same performance. <a href="Concatenated_error_correction_code" title="Concatenated error correction code">Concatenation</a> with an outer algebraic code (e.g., <a href="Reed%E2%80%93Solomon_error_correction" title="Reed–Solomon error correction">Reed–Solomon</a>) addresses the issue of <a href="Error_floor" title="Error floor">error floors</a> inherent to turbo code designs.
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Quantum_convolutional_code" title="Quantum convolutional code">Quantum convolutional code</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<ul><li><style data-mw-deduplicate="TemplateStyles:r1041539562">
/* start https://en.wikipedia.org/ */


.mw-parser-output .citation{word-wrap:break-word}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}


/* end https://en.wikipedia.org/ */
</style><span class="citation 1037C"><span class="noviewer" typeof="mw:File"><span></span></span>&nbsp;This article incorporates <a href="Copyright_status_of_works_by_the_federal_government_of_the_United_States" title="Copyright status of works by the federal government of the United States">public domain material</a> from <style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20220122224547/https://www.its.bldrdoc.gov/fs-1037/fs-1037c.htm"><i>Federal Standard 1037C</i></a>. <a href="General_Services_Administration" title="General Services Administration">General Services Administration</a>. Archived from <a rel="nofollow" class="external text" href="https://www.its.bldrdoc.gov/fs-1037/fs-1037c.htm">the original</a> on 2022-01-22.</cite></span></li></ul>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text">Benedetto, Sergio, and Guido Montorsi. "<a rel="nofollow" class="external text" href="https://web.archive.org/web/20190406181758/https://ieeexplore.ieee.org/abstract/document/390945/">Role of recursive convolutional codes in turbo codes</a>." Electronics Letters 31.11 (1995): 858-859.</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text">Eberspächer J. et al. GSM-architecture, protocols and services. John Wiley &amp; Sons, 2008. p.97</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text">3rd Generation Partnership Project (September 2012). "3GGP TS45.001: Technical Specification Group GSM/EDGE Radio Access Network; Physical layer on the radio path; General description". Retrieved 2013-07-20.</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text">Halonen, Timo, Javier Romero, and Juan Melero, eds. GSM, GPRS and EDGE performance: evolution towards 3G/UMTS. John Wiley &amp; Sons, 2004. p. 430</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text">Butman, S. A., L. J. Deutsch, and R. L. Miller. <a rel="nofollow" class="external text" href="https://tda.jpl.nasa.gov/progress_report/42-63/63H.PDF">"Performance of concatenated codes for deep space missions."</a> The Telecommunications and Data Acquisition Progress Report 42-63, March–April 1981 (1981): 33-39.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text">Moon, Todd K. "Error correction coding." Mathematical Methods and Algorithms. Jhon Wiley and Son (2005). p. 508</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text">Moon, Todd K. "<a rel="nofollow" class="external text" href="https://leseprobe.buch.de/images-adb/7b/4f/7b4f94db-7c55-4836-9b61-2ff98cb242d9.pdf">Error correction coding</a>." Mathematical Methods and Algorithms. Jhon Wiley and Son (2005).- p.508</span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.mathworks.com/help/comm/examples/llr-vs-hard-decision-demodulation.html">LLR vs. Hard Decision Demodulation (MathWorks)</a></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.mathworks.com/help/comm/ug/estimate-ber-for-hard-and-soft-decision-viterbi-decoding.html">Estimate BER for Hard and Soft Decision Viterbi Decoding (MathWorks)</a></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.mathworks.com/help/comm/ug/digital-modulation.html#brc6yjx">Digital modulation: Exact LLR Algorithm (MathWorks)</a></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.mathworks.com/help/comm/ug/digital-modulation.html#brc6ymu">Digital modulation: Approximate LLR Algorithm (MathWorks)</a></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text">Butman, S. A., L. J. Deutsch, and R. L. Miller. <a rel="nofollow" class="external text" href="https://ipnpr.jpl.nasa.gov/progress_report/42-63/63H.PDF">"Performance of concatenated codes for deep space missions." </a> The Telecommunications and Data Acquisition Progress Report 42-63, March–April 1981 (1981): 33-39.</span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.scholarpedia.org/article/Global_system_for_mobile_communications_(GSM)">Global system for mobile communications (GSM)</a></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://ch.mathworks.com/help/comm/ug/punctured-convolutional-coding-1.html">Punctured Convolutional Coding (MathWorks)</a></span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.mathworks.com/help/comm/ref/poly2trellis.html">"Convert convolutional code polynomials to trellis description – MATLAB poly2trellis"</a>.</cite></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.scholarpedia.org/article/Turbo_codes">Turbo code</a></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text">Benedetto, Sergio, and Guido Montorsi. "<a rel="nofollow" class="external text" href="https://web.archive.org/web/20190406181758/https://ieeexplore.ieee.org/abstract/document/390945/">Role of recursive convolutional codes in turbo codes</a>." Electronics Letters 31.11 (1995): 858-859.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.inference.phy.cam.ac.uk/mackay/itila/">The on-line textbook: Information Theory, Inference, and Learning Algorithms</a>, by <a href="David_J.C._MacKay" class="mw-redirect" title="David J.C. MacKay">David J.C. MacKay</a>, discusses convolutional codes in Chapter 48.</li>
<li><a rel="nofollow" class="external text" href="http://www.eccpage.com/">The Error Correcting Codes (ECC) Page</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20140522015414/http://www.mathworks.fr/fr/help/comm/convolutional-coding.html">Matlab explanations</a></li>
<li><a rel="nofollow" class="external text" href="http://www.ni.com/white-paper/14917/en/">Fundamentals of Convolutional Decoders for Better Digital Communications</a></li>
<li><a rel="nofollow" class="external text" href="http://web.mit.edu/6.02/www/s2009/handouts/labs/lab5.shtml">Convolutional codes (MIT)</a></li>
<li><a rel="nofollow" class="external text" href="http://www5.tu-ilmenau.de/nt/de/teachings/vorlesungen/itsc_master/folien/script.pdf">Information Theory and Coding (TU Ilmenau)</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170830033846/http://www5.tu-ilmenau.de/nt/de/teachings/vorlesungen/itsc_master/folien/script.pdf">Archived</a> 2017-08-30 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>, discusses convolutional codes on page 48.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Further_reading">Further reading</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Publications">Publications</h3></div>
<style data-mw-deduplicate="TemplateStyles:r1239549316">
/* start https://en.wikipedia.org/ */


.mw-parser-output .refbegin{margin-bottom:0.5em}.mw-parser-output .refbegin-hanging-indents>ul{margin-left:0}.mw-parser-output .refbegin-hanging-indents>ul>li{margin-left:0;padding-left:3.2em;text-indent:-3.2em}.mw-parser-output .refbegin-hanging-indents ul,.mw-parser-output .refbegin-hanging-indents ul li{list-style:none}@media(max-width:720px){.mw-parser-output .refbegin-hanging-indents>ul>li{padding-left:1.6em;text-indent:-1.6em}}.mw-parser-output .refbegin-columns{margin-top:0.3em}.mw-parser-output .refbegin-columns ul{margin-top:0}.mw-parser-output .refbegin-columns li{page-break-inside:avoid;break-inside:avoid-column}@media screen{.mw-parser-output .refbegin{font-size:90%}}


/* end https://en.wikipedia.org/ */
</style><div class="refbegin" style="">
<ul><li>Francis, Michael. "Viterbi Decoder Block Decoding-Trellis Termination and Tail Biting." Xilinx XAPP551 v2. 0, DD (2005): 1-21.</li>
<li>Chen, Qingchun, Wai Ho Mow, and Pingzhi Fan. "Some new results on recursive convolutional codes and their applications." Information Theory Workshop, 2006. ITW'06 Chengdu. IEEE. IEEE, 2006.</li>
<li>Fiebig, U-C., and Patrick Robertson. "Soft-decision and erasure decoding in fast frequency-hopping systems with convolutional, turbo, and Reed-Solomon codes." IEEE Transactions on Communications 47.11 (1999): 1646-1654.</li>
<li>Bhaskar, Vidhyacharan, and Laurie L. Joiner. "Performance of punctured convolutional codes in asynchronous CDMA communications under perfect phase-tracking conditions." Computers &amp; Electrical Engineering 30.8 (2004): 573-592.</li>
<li>Modestino, J., and Shou Mui. "Convolutional code performance in the Rician fading channel." IEEE Transactions on Communications 24.6 (1976): 592-606.</li>
<li>Chen, Yuh-Long, and Che-Ho Wei. "Performance evaluation of convolutional codes with MPSK on Rician fading channels." IEE Proceedings F-Communications, Radar and Signal Processing. Vol. 134. No. 2. IET, 1987.</li></ul>
</div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-04" href="https://en.wikipedia.org/wiki/?title=Convolutional_code&amp;oldid=1288693724">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>